#ifndef TIEC_ANDROID_OUTPUT_H
#define TIEC_ANDROID_OUTPUT_H

#include "../foundation.h"
#include "../util.h"

namespace NS_TIEC {
  /// 安卓平台依赖库数据结构
  struct AndroidLib {
    File file;
    bool compile_only {false};
  };

  struct AndroidLibHash {
    size_t operator()(const AndroidLib& key) const {
      return multiHash(key.file.getAbsolutePath(), key.compile_only);
    }
  };

  struct AndroidLibEqual {
    bool operator()(const AndroidLib& lhs, const AndroidLib& rhs) const {
      return lhs.file == rhs.file;
    }
  };

  using AndroidLibSet = Set<AndroidLib, AndroidLibHash, AndroidLibEqual>;

  /// Android App配置信息
  struct AndroidAppConfig {
    String app_name;
    String icon_path;
    size_t min_sdk {21};
    size_t target_sdk {28};
    size_t version_code {1};
    String version_name {"1.0"};
  };

  /// application节点下的四大组件节点
  struct ApplicationComponentNode {
    /// 组件类型(activity/service/receiver/provider)
    String type;
    /// 完整的组件类名
    String name;
    /// 组件节点的属性
    Set<String> properties;
    /// 组件节点下手动配置的子节点数据(比如 activity 的 intent-filter 节点)
    Set<String> raw_children;
  };
  struct ApplicationComponentHash {
    size_t operator()(const ApplicationComponentNode& node) const {
      return multiHash(node.name);
    }
  };
  struct ApplicationComponentEqual {
    bool operator()(const ApplicationComponentNode& lhs, const ApplicationComponentNode& rhs) const {
      return lhs.name == rhs.name;
    }
  };
  using ApplicationComponentSet = Set<ApplicationComponentNode, ApplicationComponentHash, ApplicationComponentEqual>;

  /// manifest的application节点
  struct ManifestApplicationNode {
    /// Application配置的全局主题名称
    String theme;
    /// application节点的属性
    Set<String> properties;
    /// application节点下手动配置的四大组件数据
    Set<String> raw_components;
    /// 编译器自动生成的四大组件数据
    ApplicationComponentSet components;
  };

  /// AndroidManifest.xml清单配置
  struct AndroidManifest {
    /// 包名
    String package_name;
    /// 权限信息
    Set<String> permissions;
    /// manifest节点下附加的清单节点数据
    Set<String> children;
    /// application节点
    ManifestApplicationNode application;
  };

  /// Android主题配置
  struct AndroidTheme {
    /// 主题名称(如 AppTheme)
    String name;
    /// XML style里配置的parent属性(如 @android:style/Material.Light)
    String parent;
    /// style的属性
    Set<String> properties;
  };
  struct AndroidThemeHash {
    size_t operator()(const AndroidTheme& value) const {
      return multiHash(value.name);
    }
  };
  struct AndroidThemeEqual {
    bool operator()(const AndroidTheme& lhs, const AndroidTheme& rhs) const {
      return lhs.name == rhs.name;
    }
  };
  using AndroidThemeSet = Set<AndroidTheme, AndroidThemeHash, AndroidThemeEqual>;

  /// Android res/strings资源
  struct AndroidString {
    /// string资源名称
    String name;
    /// 国际化string值, PAIR<地区/国家, 对应地区的文本翻译值>
    List<PAIR<String, String>> i18n_values;
  };
  struct AndroidStringHash {
    size_t operator()(const AndroidString& value) const {
      return multiHash(value.name);
    }
  };
  struct AndroidStringEqual {
    bool operator()(const AndroidString& lhs, const AndroidString& rhs) const {
      return lhs.name == rhs.name;
    }
  };
  using AndroidStringSet = Set<AndroidString, AndroidStringHash, AndroidStringEqual>;

  /// Android编译输出结果路径信息
  struct AndroidResultInfo {
    /// 编译输出信息文件路径
    String metadata_path;
    /// Java源代码输出路径
    String src_path;
    /// res资源路径
    String res_path;
    /// 附加安卓res的输出路径，在hardmode时将附加res资源拷贝到该目录
    String extra_res_path;
    /// assets资源路径
    String assets_path;
    /// libs资源路径
    String libs_path;
    /// jniLibs资源路径
    String jni_libs_path;
  };

  /// 安卓平台输出结果信息
  struct AndroidOutput {
    /// App配置信息
    AndroidAppConfig app_config;
    /// AndroidManifest.xml清单配置
    AndroidManifest manifest;
    /// App主题style配置
    AndroidThemeSet themes;
    /// App文本资源
    AndroidStringSet strings;
    /// 附加的res资源文件目录
    FileSet external_res_dirs;
    /// 外部依赖库(jar/aar)
    AndroidLibSet libs;
    /// 编译输出路径信息
    AndroidResultInfo result_info;
  };
}
#endif // TIEC_ANDROID_OUTPUT_H